1.问题描述
求两个大数A、B乘积的准确结果
其中A和B均为100位以上的十进制整数
A和B的位数可以不相等
2.问题分析
(1)
100位以上的整数,用整数变量直接存储装不下
所以,中间运算时,牵扯到大数肯定当做字符串
来存储
(2)
A和B直接乘操作肯定是操作不了
,必须是分开
来处理
可以二分法,将AB转换
A=A1*10^(n1/2)
+A0 —– n1为a的位数
B=B1*10^(n2/2)
+B0 —–n2为b的位数
那么 A*B={A1*10^(n1/2)+A0}*{B1*10^(n2/2)+B0}
化简得
A*B=
(A1*B1)*10^[(n1+n2)/2]
+(A1*B0)*10^(n1/2)
+(A0*B1)*10^(n2/2)
+(A0*B0)
那么就把
n1
位的整数与n2
位的整数相乘的问题转化为
1.四个`n1/2`位的整数和`n2/2`位的整数相乘
2.三次移位
3.四次“大数”加法
3.问题解决
(1)n1/2
位的整数和n2/2
位的大整数相乘
问题又回到了
原点
——大整数相乘问题
问题的解决需要调用自身
来解决——递归
(2)移位
移位相当于是在后边
补0
那么就在要移位的数(字符串)后面添加一定量的
0
即可
(3)“大数”加法
因为中间操作的都是比较大的数,因此即使是中间值的相加,也是比较大的数,故要采用大数相加
大数相加 问题 参见 大数相加
4.代码实现
import java.math.BigInteger;
import java.util.Scanner;
import org.stone.stack.MyBigAdd;
/**
* @ClassName_MyBigIntegerMutiply
* @author_Stone6762
*